home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.20-15-generic / scripts / Kbuild.include < prev    next >
Encoding:
Text File  |  2007-04-12  |  8.4 KB  |  218 lines

  1. ####
  2. # kbuild: Generic definitions
  3.  
  4. # Convinient variables
  5. comma   := ,
  6. squote  := '
  7. empty   :=
  8. space   := $(empty) $(empty)
  9.  
  10. ###
  11. # Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
  12. dot-target = $(dir $@).$(notdir $@)
  13.  
  14. ###
  15. # The temporary file to save gcc -MD generated dependencies must not
  16. # contain a comma
  17. depfile = $(subst $(comma),_,$(dot-target).d)
  18.  
  19. ###
  20. # filename of target with directory and extension stripped
  21. basetarget = $(basename $(notdir $@))
  22.  
  23. ###
  24. # Escape single quote for use in echo statements
  25. escsq = $(subst $(squote),'\$(squote)',$1)
  26.  
  27. ###
  28. # filechk is used to check if the content of a generated file is updated.
  29. # Sample usage:
  30. # define filechk_sample
  31. #    echo $KERNELRELEASE
  32. # endef
  33. # version.h : Makefile
  34. #    $(call filechk,sample)
  35. # The rule defined shall write to stdout the content of the new file.
  36. # The existing file will be compared with the new one.
  37. # - If no file exist it is created
  38. # - If the content differ the new file is used
  39. # - If they are equal no change, and no timestamp update
  40. # - stdin is piped in from the first prerequisite ($<) so one has
  41. #   to specify a valid file as first prerequisite (often the kbuild file)
  42. define filechk
  43.     $(Q)set -e;                \
  44.     echo '  CHK     $@';            \
  45.     mkdir -p $(dir $@);            \
  46.     $(filechk_$(1)) < $< > $@.tmp;        \
  47.     if [ -r $@ ] && cmp -s $@ $@.tmp; then    \
  48.         rm -f $@.tmp;            \
  49.     else                    \
  50.         echo '  UPD     $@';        \
  51.         mv -f $@.tmp $@;        \
  52.     fi
  53. endef
  54.  
  55. ######
  56. # gcc support functions
  57. # See documentation in Documentation/kbuild/makefiles.txt
  58.  
  59. # output directory for tests below
  60. TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)
  61.  
  62. # as-option
  63. # Usage: cflags-y += $(call as-option, -Wa$(comma)-isa=foo,)
  64.  
  65. as-option = $(shell if $(CC) $(CFLAGS) $(1) -Wa,-Z -c -o /dev/null \
  66.          -xassembler /dev/null > /dev/null 2>&1; then echo "$(1)"; \
  67.          else echo "$(2)"; fi ;)
  68.  
  69. # as-instr
  70. # Usage: cflags-y += $(call as-instr, instr, option1, option2)
  71.  
  72. as-instr = $(shell if echo -e "$(1)" | \
  73.               $(CC) $(AFLAGS) -c -xassembler - \
  74.                 -o $(TMPOUT)astest$$$$.out > /dev/null 2>&1; \
  75.            then rm $(TMPOUT)astest$$$$.out; echo "$(2)"; \
  76.            else echo "$(3)"; fi)
  77.  
  78. # cc-option
  79. # Usage: cflags-y += $(call cc-option, -march=winchip-c6, -march=i586)
  80.  
  81. cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
  82.              > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
  83.  
  84. # cc-option-yn
  85. # Usage: flag := $(call cc-option-yn, -march=winchip-c6)
  86. cc-option-yn = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
  87.                 > /dev/null 2>&1; then echo "y"; else echo "n"; fi;)
  88.  
  89. # cc-option-align
  90. # Prefix align with either -falign or -malign
  91. cc-option-align = $(subst -functions=0,,\
  92.     $(call cc-option,-falign-functions=0,-malign-functions=0))
  93.  
  94. # cc-version
  95. # Usage gcc-ver := $(call cc-version, $(CC))
  96. cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC))
  97.  
  98. # cc-ifversion
  99. # Usage:  EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
  100. cc-ifversion = $(shell if [ $(call cc-version, $(CC)) $(1) $(2) ]; then \
  101.                        echo $(3); fi;)
  102.  
  103. # ld-option
  104. # Usage: ldflags += $(call ld-option, -Wl$(comma)--hash-style=both)
  105. ld-option = $(shell if $(CC) $(1) -nostdlib -xc /dev/null \
  106.                  -o $(TMPOUT)ldtest$$$$.out > /dev/null 2>&1; \
  107.              then rm $(TMPOUT)ldtest$$$$.out; echo "$(1)"; \
  108.              else echo "$(2)"; fi)
  109.  
  110. ###
  111. # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
  112. # Usage:
  113. # $(Q)$(MAKE) $(build)=dir
  114. build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
  115.  
  116. # Prefix -I with $(srctree) if it is not an absolute path
  117. addtree = $(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1))) $(1)
  118. # Find all -I options and call addtree
  119. flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o)))
  120.  
  121. # If quiet is set, only print short version of command
  122. cmd = @$(echo-cmd) $(cmd_$(1))
  123.  
  124. # Add $(obj)/ for paths that is not absolute
  125. objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
  126.  
  127. ###
  128. # if_changed      - execute command if any prerequisite is newer than 
  129. #                   target, or command line has changed
  130. # if_changed_dep  - as if_changed, but uses fixdep to reveal dependencies
  131. #                   including used config symbols
  132. # if_changed_rule - as if_changed but execute rule instead
  133. # See Documentation/kbuild/makefiles.txt for more info
  134.  
  135. ifneq ($(KBUILD_NOCMDDEP),1)
  136. # Check if both arguments has same arguments. Result in empty string if equal
  137. # User may override this check using make KBUILD_NOCMDDEP=1
  138. arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
  139.                     $(filter-out $(cmd_$@),   $(cmd_$(1))) )
  140. endif
  141.  
  142. # echo command. Short version is $(quiet) equals quiet, otherwise full command
  143. echo-cmd = $(if $($(quiet)cmd_$(1)), \
  144.     echo '  $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
  145.  
  146. # >'< substitution is for echo to work,
  147. # >$< substitution to preserve $ when reloading .cmd file
  148. # note: when using inline perl scripts [perl -e '...$$t=1;...']
  149. # in $(cmd_xxx) double $$ your perl vars
  150. make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))
  151.  
  152. # Find any prerequisites that is newer than target or that does not exist.
  153. # PHONY targets skipped in both cases.
  154. any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
  155.  
  156. # Execute command if command has changed or prerequisitei(s) are updated
  157. #
  158. if_changed = $(if $(strip $(any-prereq) $(arg-check)),                       \
  159.     @set -e;                                                             \
  160.     $(echo-cmd) $(cmd_$(1));                                             \
  161.     echo 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
  162.  
  163. # execute the command and also postprocess generated .d dependencies
  164. # file
  165. if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ),                  \
  166.     @set -e;                                                             \
  167.     $(echo-cmd) $(cmd_$(1));                                             \
  168.     scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\
  169.     rm -f $(depfile);                                                    \
  170.     mv -f $(dot-target).tmp $(dot-target).cmd)
  171.  
  172. # Usage: $(call if_changed_rule,foo)
  173. # will check if $(cmd_foo) changed, or any of the prequisites changed,
  174. # and if so will execute $(rule_foo)
  175. if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ),                 \
  176.     @set -e;                                                             \
  177.     $(rule_$(1)))
  178.  
  179. ###
  180. # why - tell why a a target got build
  181. #       enabled by make V=2
  182. #       Output (listed in the order they are checked):
  183. #          (1) - due to target is PHONY
  184. #          (2) - due to target missing
  185. #          (3) - due to: file1.h file2.h
  186. #          (4) - due to command line change
  187. #          (5) - due to missing .cmd file
  188. #          (6) - due to target not in $(targets)
  189. # (1) PHONY targets are always build
  190. # (2) No target, so we better build it
  191. # (3) Prerequisite is newer than target
  192. # (4) The command line stored in the file named dir/.target.cmd
  193. #     differed from actual command line. This happens when compiler
  194. #     options changes
  195. # (5) No dir/.target.cmd file (used to store command line)
  196. # (6) No dir/.target.cmd file and target not listed in $(targets)
  197. #     This is a good hint that there is a bug in the kbuild file
  198. ifeq ($(KBUILD_VERBOSE),2)
  199. why =                                                                        \
  200.     $(if $(filter $@, $(PHONY)),- due to target is PHONY,                    \
  201.         $(if $(wildcard $@),                                                 \
  202.             $(if $(strip $(any-prereq)),- due to: $(any-prereq),             \
  203.                 $(if $(arg-check),                                           \
  204.                     $(if $(cmd_$@),- due to command line change,             \
  205.                         $(if $(filter $@, $(targets)),                       \
  206.                             - due to missing .cmd file,                      \
  207.                             - due to $(notdir $@) not in $$(targets)         \
  208.                          )                                                   \
  209.                      )                                                       \
  210.                  )                                                           \
  211.              ),                                                              \
  212.              - due to target missing                                         \
  213.          )                                                                   \
  214.      )
  215.  
  216. echo-why = $(call escsq, $(strip $(why)))
  217. endif
  218.